/*
加密/解密可逆的算法 -> 加密算法
加密/解密使用相同的密钥 -> 对称加密算法
对称加密算法的密钥可以随机给 但是有位数的要求
对称加密算法的输入数据没有长度要求

各加密算法的密钥长度：
 RC4 密钥长度1-256字节
 DES 密钥长度8字节
 3DES/DESede/TripleDES 密钥长度24字节
 AES 密钥长度16、24、32字节 根据密钥长度不同AES又分为AES-128、AES-192、AES-256
 SM4密钥长度16字节

对称加密分类：
 序列加密/流加密：以字节流的方式，依次加密（解密）明文（密文）中的每一个字节 ->RC4
 分组加密：将明文消息分组（每组有多个字节），逐组进行加密 -> DES 3DES AES SM4
*/

// // ECB
// luojinsheng luojinsheng luojinsheng ss
// SSSSSSSS    EEEEEEEE    RRRRRRRR    TTTTTTTT
// SSSSSSSSEEEEEEEERRRRRRRRTTTTTTTT

// // CBC
// 12345678 // iv向量
// luojinsheng luojinsheng luojinsheng ss
//
// luojinsheng ^ 12345678 -> SSSSSSSS
// SSSSSSSS 加密 -> dddddddd
// dddddddd ^ bangxiao -> RRRRRRRR
// RRRRRRRR 加密 ->TTTTTTTT
// TTTTTTTT ^ jianbang -> ffffffff
// ffffffff 加密 -> hhhhhhhh
// ddddddddTTTTTTTThhhhhhhh





// DES算法 密钥长度64bit（8个字节）
// 加密
// let CryptoJS = require('./CryptoJS');
//
// let plainText = CryptoJS.enc.Utf8.parse('luojinsheng');
// let key = CryptoJS.enc.Utf8.parse('12345678');  // 使用12345678和03254769的加密结果是一致的 密钥长度8字节
// //let key = CryptoJS.enc.Utf8.parse('03254769');
// let iv = CryptoJS.enc.Utf8.parse('88888888');
// var cfg = {
//     iv: iv,
//     mode: CryptoJS.mode.CBC,
//     padding: CryptoJS.pad.Pkcs7
// };
// let cipherObj = CryptoJS.DES.encrypt(plainText, key, cfg);
// //console.log(cipherObj.toString());
// console.log(cipherObj.ciphertext.toString());


// 解密 key iv mode 必须和之前一样   cipherText密文必须是base64编码
// //9a41f0e3a278c6018bed9d770c482da2
// let key = CryptoJS.enc.Utf8.parse('12345678');
// //let key = CryptoJS.enc.Utf8.parse('03254769');
// let iv = CryptoJS.enc.Utf8.parse('88888888');
// let cipherText = CryptoJS.enc.Hex.parse('9a41f0e3a278c6018bed9d770c482da2').toString(CryptoJS.enc.Base64);
// var cfg = {
//     iv: iv,
//     mode: CryptoJS.mode.CBC,
//     padding: CryptoJS.pad.Pkcs7
// };
// let plainObj = CryptoJS.DES.decrypt(cipherText, key, cfg);
// console.log(plainObj.toString(CryptoJS.enc.Utf8));

// 实际上key的值 只用到了56位bit 因为每一个的最后一个是没有使用的00110001的1没用 以此类推
//00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000   12345678
//00110000 00110011 00110010 00110101 00110100 00110111 00110110 00111001   03254769



// DESede  其实就是前8个加密 然后中间8个解密 然后最后8个再加密 123456783333333388888888
// let CryptoJS = require('./CryptoJS');
//
// let plainText = CryptoJS.enc.Utf8.parse('luojinsheng');
// let key = CryptoJS.enc.Utf8.parse('123456783333333388888888');  // 只需要改密钥的长度 密钥长度24字节
// let iv = CryptoJS.enc.Utf8.parse('88888888');
// var cfg = {
//     iv: iv,
//     mode: CryptoJS.mode.CBC,
//     padding: CryptoJS.pad.Pkcs7
// };
// let cipherObj = CryptoJS.TripleDES.encrypt(plainText, key, cfg);   // 以及这个的加密方法TripleDES
// //console.log(cipherObj.toString());    // 这样是输出base64格式的
// console.log(cipherObj.ciphertext.toString());   // 加上.ciphertext输出的是hex格式的




// CryptoJS自动生成key、iv、salt
// let CryptoJS = require('./CryptoJS');
// let format = {
//     stringify: function (data){
//         let e = {
//             ct: data.ciphertext.toString(),
//             iv: data.iv.toString(),
//             salt: data.salt.toString(),
//         };
//         return JSON.stringify(e)
//     },
//     parse: function (data){
//         let json = JSON.parse(data);
//         return  CryptoJS.lib.CipherParams.create({
//             ciphertext: CryptoJS.enc.Hex.parse(json.ct),
//             iv: CryptoJS.enc.Hex.parse(json.iv),
//             salt: CryptoJS.enc.Hex.parse(json.salt),
//         });
//     }
// };
// var cfg = {
//     format: format
// };
// let cipherObj = CryptoJS.AES.encrypt('luojinsheng', '12345678123456781234567812345678', cfg);
// let cipherText = cipherObj.toString();
// console.log(cipherText);
//
// let plainObj = CryptoJS.AES.decrypt(cipherText, '12345678123456781234567812345678', cfg);
// console.log(plainObj.toString(CryptoJS.enc.Utf8));





// CryptoJS其他算法简介
let CryptoJS = require('./CryptoJS');
console.log(CryptoJS.RIPEMD160('luojinsheng').toString());
console.log(CryptoJS.HmacRIPEMD160('luojinsheng', 'keykeykey').toString());
console.log(CryptoJS.PBKDF2('luojinsheng', 'keykeykey123', {keySize: 4, iterations: 2000}).toString());
console.log(CryptoJS.EvpKDF('luojinsheng', 'keykeykey123', {keySize: 4, iterations: 2000}).toString());

console.log(CryptoJS.RC4);
console.log(CryptoJS.RC4Drop);
console.log(CryptoJS.Rabbit);
console.log(CryptoJS.RabbitLegacy);





